#include <iostream>
#include <unistd.h>
#include "blockQueue.hpp"
#include "Task.hpp"

// 多生产者多消费者
void *consumer(void *args)
{
    // sleep(8);

    blockQueue<func_t> *bq = static_cast<blockQueue<func_t> *>(args);
    while (true)
    {
        // 1、消费任务
        func_t f = bq->Pop();
        // 2、处理任务
        f();
        std::cout << "消费一个任务..." << std::endl;

        sleep(1);
    }
    return nullptr;
}
void *productor(void *args)
{
    blockQueue<func_t> *bq = static_cast<blockQueue<func_t> *>(args);
    sleep(10);
    while (true)
    {
        // 1、获得任务
        // 2、生产任务
        func_t f = downLoad;
        bq->Equeue(f);
        std::cout << "生产一个数据..." << std::endl;
        sleep(1);
    }
    return nullptr;
}
int main()
{
    blockQueue<func_t> *bq = new blockQueue<func_t>();
    pthread_t c[2], p[3];
    pthread_create(&c[0], nullptr, consumer, (void *)bq);
    pthread_create(&c[1], nullptr, consumer, (void *)bq);

    pthread_create(&p[0], nullptr, productor, (void *)bq);
    pthread_create(&p[1], nullptr, productor, (void *)bq);
    pthread_create(&p[2], nullptr, productor, (void *)bq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);

    return 0;
}
// 当任务是一个函数
// void *consumer(void *args)
// {
//     //sleep(8);

//     blockQueue<func_t> *bq = static_cast<blockQueue<func_t> *>(args);
//     while (true)
//     {
//         //1、消费任务
//         func_t f = bq->Pop();
//         //2、处理任务
//         f();
//         std::cout << "消费一个任务..." << std::endl;

//         sleep(1);
//     }
//     return nullptr;
// }
// void *productor(void *args)
// {
//     blockQueue<func_t> *bq = static_cast<blockQueue<func_t> *>(args);
//     sleep(3);
//     while (true)
//     {
//         // 1、获得任务
//         //2、生产任务
//         func_t f = downLoad;
//         bq->Equeue(f);
//         std::cout << "生产一个数据..." << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     blockQueue<func_t> *bq = new blockQueue<func_t>();
//     pthread_t c, p;
//     pthread_create(&c, nullptr, consumer, (void *)bq);
//     pthread_create(&p, nullptr, productor, (void *)bq);

//     pthread_join(c, nullptr);
//     pthread_join(p, nullptr);
//     return 0;
// }

// void *consumer(void *args)
// {
//     //sleep(8);

//     blockQueue<Task> *bq = static_cast<blockQueue<Task> *>(args);
//     while (true)
//     {
//         //1、消费任务
//         Task t = bq->Pop();
//         //2、处理任务
//         std::cout << "消费一个数据..."
//         << " getX: " << t.getX() << " getY: " << t.getY()
//         << " 任务处理计算结果 :" << t.Execute() << std::endl;

//         sleep(1);
//     }
//     return nullptr;
// }
// void *productor(void *args)
// {
//     blockQueue<Task> *bq = static_cast<blockQueue<Task> *>(args);
//     int x = 0, y = 0;
//     sleep(3);
//     while (true)
//     {
//         // 1、获得任务
//         Task t(x, y);
//         //2、生产任务
//         bq->Equeue(t);
//         std::cout << "生产一个数据..." << " x: " << x << " y: " << y << std::endl;
//         x++, y++;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     blockQueue<Task> *bq = new blockQueue<Task>();
//     pthread_t c, p;
//     pthread_create(&c, nullptr, consumer, (void *)bq);
//     pthread_create(&p, nullptr, productor, (void *)bq);

//     pthread_join(c, nullptr);
//     pthread_join(p, nullptr);
//     return 0;
// }